// 防抖:  一定时间内，只有最后一次操作，再过wait毫秒后才执行函数
// fnc = 回调函数  wait = 延时的时间    immediate = 是否立即执行
// 防抖定时器
let timeoutDebounce: any = null
export const debounce = function(fnc: () => any, wait = 500, immediate = false) {
    if(timeoutDebounce != null) clearTimeout(timeoutDebounce)
    if(immediate) {
        var callNow = !timeoutDebounce;
        timeoutDebounce = setTimeout(() => {
            timeoutDebounce = null;
        }, wait);
        if(callNow) {
            typeof fnc === 'function' && fnc();
        }
    }else{
        timeoutDebounce = setTimeout(() => {
            typeof fnc === 'function' && fnc();
        }, wait);
    }
}


// 节流:  在一定时间内，只执行一次
// fnc = 回调函数   wait = 延时的时间  immediate = 是否立即执行// 节流定时器
let timeoutThrottle, flag: boolean;
export const throttle = function(fnc: any, wait = 500, immediate = true) {
    if(immediate) {
        if(!flag) {
            flag = true
            typeof fnc === 'function' && fnc();
            timeoutThrottle = setTimeout(() => {
                flag = false
            }, wait);
        }
    }else{
        if(!flag) {
            flag = true
            timeoutThrottle = setTimeout(() => {
                flag = false
                typeof fnc === 'function' && fnc()
            }, wait);
        }
    }
}



/**
 * 时间格式化
 * @param {*} dateTime，秒、毫秒
 * @param {*} fmt，格式
 * yyyy:mm:dd | yyyy:mm | yyyy年mm月dd日 | yyyy年mm月dd日 hh时MM分...
 */
export const timeFormat = function(dateTime: number | null = null, fmt = 'yyyy-mm-dd') {
	// 如果dateTime为null,则格式化当前时间
	if (!dateTime) {
		dateTime = Number(new Date());
	}
	// 如果dateTime长度为10或者13，则为秒和毫秒的时间戳，如果超过13位，则为其他的时间格式
	if (dateTime.toString().length == 10) {
		dateTime *= 1000;
	}
	let date = new Date(dateTime);
	let ret;
	let opt: any = {
		"y+": date.getFullYear().toString(), 	// 年
		"m+": (date.getMonth() + 1).toString(), // 月
		"d+": date.getDate().toString(), 		// 日
		"h+": date.getHours().toString(), 		// 时
		"M+": date.getMinutes().toString(), 	// 分
		"s+": date.getSeconds().toString() 		// 秒
	};
	for (let k in opt) {
		ret = new RegExp("(" + k + ")").exec(fmt);
		if (ret) {
			// padStart() 方法用另一个字符串填充当前字符串(如果需要的话，会重复多次)，以便产生的字符串达到给定的长度。从当前字符串的左侧开始填充
			fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
		};
	};
	return fmt;
}